package filtro;


import fabricas.ConexaoHibernateFabrica;
import java.io.IOException;
import javax.servlet.*;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
/**
 * 
 * @author Marcelo G. Neto
 */

// Padrão MVC
// MODEL: Representa as camadas de acesso a dados e regra de negócio.

/* Criação da infraestruura para a conexão ao banco de dados.
 * 
 * Para evitar a criação de uma nova conexão com o banco de dados a cada operação, que consumiria recursos do banco
 * e deixaria lentos a conexão e o processamento da página, usaremos a técnica comum em aplicativos web chamada
 * Open Session in View. Ela define que a sessão do Hibernate será aberta no início do processamento da requisição
 * no servidor e finalizada no final do processamento.
 * 
 * A configuração da classe Filter é realizada no arquivo web.xml. Essa configuração determina que toda requisição
 * que tiver a extensão .jsf envolvida seja interceptada pela classe ConexaoHibernateFiltro
 */
public class ConexaoHibernateFiltro implements Filter
{
    // Classe que cria todas as sessões do Hibernate, a cada requisição.
    private SessionFactory sf;
    //private FilterConfig filterConfig;
    //private CriaArquivoPropContext criaArquivoPropContext;

    @Override
    public void init(FilterConfig config) throws ServletException
    {

            //this.servletConfig = (ServletConfig) config;
            //System.setSecurityManager(null);
            /*
            this.filterConfig = config;
            ServletContext servletContext = config.getServletContext();
            Enumeration atributos = servletContext.getAttributeNames();
            while (atributos.hasMoreElements())
            {
                String atributo = (String) atributos.nextElement();
                System.out.println("Atributo nome: " + atributo);
                System.out.println("Atributo valor: " + servletContext.getAttribute(atributo));
                
            }
            */
            //InitialContext ic = new InitialContext();  
            //this.sf = (SessionFactory) ic.lookup( "java:/comp/env/jdbc/SisolvDB" );
            this.sf = ConexaoHibernateFabrica.getSessionFactory();
            //this.criaArquivoPropContext = new CriaArquivoPropContext();
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException
    {
        
        try
        {
            this.sf.getCurrentSession().beginTransaction();
            chain.doFilter(servletRequest, servletResponse);
            this.sf.getCurrentSession().getTransaction().commit();
            this.sf.getCurrentSession().close();
        }
        catch (HibernateException | IOException | ServletException ex)
        {
            try
            {
                if (this.sf.getCurrentSession().getTransaction().isActive()) {
                    this.sf.getCurrentSession().getTransaction().rollback();
                }
            }
            catch (Throwable t)
                {}
            throw new ServletException(ex);
	}
    }

    @Override
    public void destroy() {}
}